package article10.equals;

import javafx.scene.control.ColorPicker;

import java.awt.*;
import java.util.Set;

/**
 * 彩色的点
 *
 * @Author: cctv
 * @Date: 2019/4/2 14:08
 */
public class ColorPoint extends Point {

    private final Color color;

    public ColorPoint(int x, int y, Color color) {
        super(x, y);
        this.color = color;
    }

    /**
     * broken - violates symmetry
     * 违反对称性
     * 这个方法的问题在于，在比较普通点和有色点，以及相反的情形时，可能会得到不同的结果
     * 前一种比较忽略了颜色信息，而后一种比较则总是返回false ，因为参数的类型不正确
     *
     * @param o
     * @return
     */
    @Override
    public boolean equals(Object o) {
        if (!(o instanceof ColorPoint)) {
            return false;
        }
        return super.equals(o) && ((ColorPoint) o).color == color;

    }


    /**
     * broken - violates transitivity!
     * 违反传递性
     * 这个方法的问题在于，在比较普通点和有色点，以及相反的情形时，可能会得到不同的结果
     * 前一种比较忽略了颜色信息，而后一种比较则总是返回false ，因为参数的类型不正确
     *
     * @param o
     * @return
     */
    public boolean equals1(Object o) {
        if (!(o instanceof Point)) {
            return false;
        }
        if (!(o instanceof ColorPoint)) {
            return o.equals(this);
        }
        return super.equals(o) && ((ColorPoint) o).color == color;

    }

    /**
     * Broken - Liskov Substitution Principle（page 43）
     * 违反里氏替换原则
     * 这个方法的问题在于，在比较普通点和有色点，以及相反的情形时，可能会得到不同的结果
     * 前一种比较忽略了颜色信息，而后一种比较则总是返回false ，因为参数的类型不正确
     *
     * @param o
     * @return
     */
    public boolean equals2(Object o) {
        if (o == null || o.getClass() != getClass()) {
            return false;
        }
        Point p = (Point) o;
        return p.x == x && p.y == y;


    }


    /**
     * 检查某个点是否在圆中
     * set.of 需要 jdk9+
     *
    private static final Set<Point> unitCircle = Set.of(
            new Point(1, 0), new Point(0, 1),
            new Point(-1, 0), new Point(0, -1));

    public static boolean onUnitCircle(Point p) {
        return unitCircle.contains(p);
    }
     */

    //remainder omitted


}
